package com.powernode.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.powernode.constant.ManagerConstants;
import com.powernode.domain.SysMenu;
import com.powernode.exception.BusinessException;
import com.powernode.mapper.SysMenuMapper;
import com.powernode.service.SysMenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

@Service
@CacheConfig(cacheNames = "com.powernode.service.impl.SysMenuServiceImpl")
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements SysMenuService {
    @Autowired
    private SysMenuMapper sysMenuMapper;
    /*
     * 根据用户id查询菜单
     * @author RenBoQing
     * @date 2024/7/7 21:52
     * @param userId
     * @return java.util.Set<com.powernode.domain.SysMenu>
     */
    @Override
    @Cacheable(key = "#userId")
    public Set<SysMenu> queryUserMenus(Long userId) {
        // 根据用户ID查询菜单集合
        Set<SysMenu> sysMenus = sysMenuMapper.selectUserMenusByUserId(userId);
        // 判断菜单集合是否有值
        if (!CollectionUtils.isEmpty(sysMenus) && sysMenus.size() != 0) {
            // 将菜单集合转换为树结构
            sysMenus = translateMenusToTree(sysMenus, 0L);
        }
        return sysMenus;
    }
    /*
     * 查询系统所有的权限集合
     * @author RenBoQing
     * @date 2024/7/12 21:26
     * @return java.util.Set<com.powernode.domain.SysMenu>
     */
    @Override
    @Cacheable(key = ManagerConstants.SYS_ALL_MENU_KEY)
    public List<SysMenu> queryAllSysMenuList() {
        return sysMenuMapper.selectList(null);
    }
     /*
      * 新增权限
      * @author RenBoQing
      * @date 2024/7/18 23:19
      * @param sysMenu
      * @return boolean
      */
    @Override
    @CacheEvict(key = ManagerConstants.SYS_ALL_MENU_KEY)
    public boolean saveSysMenu(SysMenu sysMenu) {
        return sysMenuMapper.insert(sysMenu) > 0;
    }
     /*
      * 修改菜单权限信息
      * @author RenBoQing
      * @date 2024/7/18 23:38
      * @param sysMenu
      * @return boolean
      */
    @Override
    @CacheEvict(key = ManagerConstants.SYS_ALL_MENU_KEY)
    public boolean modifySysMenu(SysMenu sysMenu) {
        // 获取菜单的类型
        Integer type = sysMenu.getType();
        if (0 == type) {
            sysMenu.setParentId(0L);
        }
        return sysMenuMapper.updateById(sysMenu) > 0;
    }
     /*
      * 删除菜单权限信息
      * @author RenBoQing
      * @date 2024/7/21 11:34
      * @param menuId
      * @return boolean
      */
    @Override
    public boolean removeSysMenuById(Long menuId) {
        // 判断当前传递的过来的节点 是否有子节点  如果有子节点则不能删除
        // 查询当前节点的子节点
        List<SysMenu> sysMenus = sysMenuMapper.selectList(new LambdaQueryWrapper<SysMenu>().eq(SysMenu::getParentId, menuId));
        // 判断 是否有值
        if (CollectionUtils.isEmpty(sysMenus) && sysMenus.size() == 0) {
            // 删除当前节点
            return sysMenuMapper.deleteById(menuId) > 0;
        }
        // 不能删除 直接抛异常
        else {
           throw  new BusinessException("当前节点有子节点，不能删除");
        }
    }

    /*
     *将上述的菜单转化为树形结构
     * @author RenBoQing
     * @date 2024/7/7 21:52
     * @param sysMenus
     * @param pid
     * @return java.util.Set<com.powernode.domain.SysMenu>
     */
    private Set<SysMenu> translateMenusToTree(Set<SysMenu> sysMenus, Long pid) {
        // 获取菜单的根节点集合
        Set<SysMenu> roots = sysMenus.stream()
                .filter(menu -> menu.getParentId().equals(pid))
                .collect(Collectors.toSet());
        // 循环遍历父节点集合，根据指定父节点id查询子节点集合
        roots.forEach(r -> r.setList(translateMenusToTree(sysMenus, r.getMenuId())));
        return roots;
    }
}
